import downLoadQueue from './download.js'

function hashCode(string) {
  if (typeof string !== 'string') string += ''
  // 空字符串处理
  if (string.length === 0) return '0'

  let hash = 5381
  for (let i = 0; i < string.length; i++) {
    const chr = string.charCodeAt(i)
    hash = ((hash << 5) - hash) + chr
    hash |= 0 // 强制转换为32位整数
  }

  // 处理负数
  return Math.abs(hash).toString(16)
}

/**
 * 拼接图片文件缓存路径
 * @param {string} imgUrl 网络图片地址
 */
function createHashPath(imgUrl) {
  const fileName = hashCode(imgUrl)
  // #ifdef MP-WEIXIN
  return `${wx.env.USER_DATA_PATH}/${fileName}`
  // #endif
  // #ifdef APP-PLUS
  return `_doc/imgCache/${fileName}`
  // #endif
}

const cacheMap = new Map()

function setStorage(key, val) {
  cacheMap.set(key, val)
}

function getStorage(key) {
  return cacheMap.get(key)
}

/**
 * 根据文件路径判断文件是否存在
 * @param {string} filePath 文件路径
 */
export function isExistFile(filePath) {
  return new Promise(resolve => {
    // #ifdef APP-PLUS
    const p = getStorage(filePath)
    if (p) {
      resolve(p)
      return
    }
    plus.io.resolveLocalFileSystemURL(filePath, () => {
      setStorage(filePath, filePath)
      resolve(filePath)
    }, () => resolve(filePath))
    // #endif
    // #ifdef MP-WEIXIN
    uni.getFileSystemManager().readFile({
      filePath,
      success: (res) => {
        resolve(filePath)
      },
      fail: (res) => {
        resolve(filePath)
      }
    })
    // #endif
  })
}
/**
 * 图片缓存操作类
 */
export class ImgCache {
  /**
   * 设置图片缓存
   * @param {string} imgUrl 网络图片地址
   */
  static async setCache(imgUrl, filePath) {
    // 创建图片下载任务
    const task = {
      // 图片路径
      filePath,
      url: imgUrl
    }
    // 添加图片下载任务
    downLoadQueue.add(task)
  }

  /**
   * 获取图片缓存
   * @param {string} imgUrl 网络图片地址
   */
  static async getCache(imgUrl) {
    // #ifdef H5
    return imgUrl
    // #endif
    return imgUrl
    // 创建文件key值
    const filePath = createHashPath(imgUrl)
    const localUrl = await isExistFile(filePath)
    if (localUrl) return localUrl
    // 并且设置缓存
    ImgCache.setCache(imgUrl, filePath)
    return imgUrl
  }
}
